home *** CD-ROM | disk | FTP | other *** search
/ Windows Game Programming for Dummies (2nd Edition) / WinGamProgFD.iso / mac / DirectX SDK / DXSDK / include / d3dx8mesh.h < prev    next >
C/C++ Source or Header  |  2001-10-16  |  29KB  |  761 lines

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  Copyright (C) Microsoft Corporation.  All Rights Reserved.
  4. //
  5. //  File:       d3dx8mesh.h
  6. //  Content:    D3DX mesh types and functions
  7. //
  8. //////////////////////////////////////////////////////////////////////////////
  9.  
  10. #include "d3dx8.h"
  11.  
  12. #ifndef __D3DX8MESH_H__
  13. #define __D3DX8MESH_H__
  14.  
  15. #include "dxfile.h"     // defines LPDIRECTXFILEDATA
  16.  
  17. // {2A835771-BF4D-43f4-8E14-82A809F17D8A}
  18. DEFINE_GUID(IID_ID3DXBaseMesh, 
  19. 0x2a835771, 0xbf4d, 0x43f4, 0x8e, 0x14, 0x82, 0xa8, 0x9, 0xf1, 0x7d, 0x8a);
  20.  
  21. // {CCAE5C3B-4DD1-4d0f-997E-4684CA64557F}
  22. DEFINE_GUID(IID_ID3DXMesh, 
  23. 0xccae5c3b, 0x4dd1, 0x4d0f, 0x99, 0x7e, 0x46, 0x84, 0xca, 0x64, 0x55, 0x7f);
  24.  
  25. // {19FBE386-C282-4659-97BD-CB869B084A6C}
  26. DEFINE_GUID(IID_ID3DXPMesh, 
  27. 0x19fbe386, 0xc282, 0x4659, 0x97, 0xbd, 0xcb, 0x86, 0x9b, 0x8, 0x4a, 0x6c);
  28.  
  29. // {4E3CA05C-D4FF-4d11-8A02-16459E08F6F4}
  30. DEFINE_GUID(IID_ID3DXSPMesh, 
  31. 0x4e3ca05c, 0xd4ff, 0x4d11, 0x8a, 0x2, 0x16, 0x45, 0x9e, 0x8, 0xf6, 0xf4);
  32.  
  33. // {8DB06ECC-EBFC-408a-9404-3074B4773515}
  34. DEFINE_GUID(IID_ID3DXSkinMesh, 
  35. 0x8db06ecc, 0xebfc, 0x408a, 0x94, 0x4, 0x30, 0x74, 0xb4, 0x77, 0x35, 0x15);
  36.  
  37. // Mesh options - lower 3 bytes only, upper byte used by _D3DXMESHOPT option flags
  38. enum _D3DXMESH {
  39.     D3DXMESH_32BIT                  = 0x001, // If set, then use 32 bit indices, if not set use 16 bit indices.
  40.     D3DXMESH_DONOTCLIP              = 0x002, // Use D3DUSAGE_DONOTCLIP for VB & IB.
  41.     D3DXMESH_POINTS                 = 0x004, // Use D3DUSAGE_POINTS for VB & IB. 
  42.     D3DXMESH_RTPATCHES              = 0x008, // Use D3DUSAGE_RTPATCHES for VB & IB. 
  43.     D3DXMESH_NPATCHES               = 0x4000,// Use D3DUSAGE_NPATCHES for VB & IB. 
  44.     D3DXMESH_VB_SYSTEMMEM           = 0x010, // Use D3DPOOL_SYSTEMMEM for VB. Overrides D3DXMESH_MANAGEDVERTEXBUFFER
  45.     D3DXMESH_VB_MANAGED             = 0x020, // Use D3DPOOL_MANAGED for VB. 
  46.     D3DXMESH_VB_WRITEONLY           = 0x040, // Use D3DUSAGE_WRITEONLY for VB.
  47.     D3DXMESH_VB_DYNAMIC             = 0x080, // Use D3DUSAGE_DYNAMIC for VB.
  48.     D3DXMESH_VB_SOFTWAREPROCESSING = 0x8000, // Use D3DUSAGE_SOFTWAREPROCESSING for VB.
  49.     D3DXMESH_IB_SYSTEMMEM           = 0x100, // Use D3DPOOL_SYSTEMMEM for IB. Overrides D3DXMESH_MANAGEDINDEXBUFFER
  50.     D3DXMESH_IB_MANAGED             = 0x200, // Use D3DPOOL_MANAGED for IB.
  51.     D3DXMESH_IB_WRITEONLY           = 0x400, // Use D3DUSAGE_WRITEONLY for IB.
  52.     D3DXMESH_IB_DYNAMIC             = 0x800, // Use D3DUSAGE_DYNAMIC for IB.
  53.     D3DXMESH_IB_SOFTWAREPROCESSING= 0x10000, // Use D3DUSAGE_SOFTWAREPROCESSING for IB.
  54.  
  55.     D3DXMESH_VB_SHARE               = 0x1000, // Valid for Clone* calls only, forces cloned mesh/pmesh to share vertex buffer
  56.  
  57.     D3DXMESH_USEHWONLY              = 0x2000, // Valid for ID3DXSkinMesh::ConvertToBlendedMesh
  58.  
  59.     // Helper options
  60.     D3DXMESH_SYSTEMMEM              = 0x110, // D3DXMESH_VB_SYSTEMMEM | D3DXMESH_IB_SYSTEMMEM
  61.     D3DXMESH_MANAGED                = 0x220, // D3DXMESH_VB_MANAGED | D3DXMESH_IB_MANAGED
  62.     D3DXMESH_WRITEONLY              = 0x440, // D3DXMESH_VB_WRITEONLY | D3DXMESH_IB_WRITEONLY
  63.     D3DXMESH_DYNAMIC                = 0x880, // D3DXMESH_VB_DYNAMIC | D3DXMESH_IB_DYNAMIC
  64.     D3DXMESH_SOFTWAREPROCESSING   = 0x18000, // D3DXMESH_VB_SOFTWAREPROCESSING | D3DXMESH_IB_SOFTWAREPROCESSING
  65.  
  66. };
  67.  
  68. // option field values for specifying min value in D3DXGeneratePMesh and D3DXSimplifyMesh
  69. enum _D3DXMESHSIMP
  70. {
  71.     D3DXMESHSIMP_VERTEX   = 0x1,
  72.     D3DXMESHSIMP_FACE     = 0x2,
  73.  
  74. };
  75.  
  76. enum _MAX_FVF_DECL_SIZE
  77. {
  78.     MAX_FVF_DECL_SIZE = 20
  79. };
  80.  
  81. typedef struct ID3DXBaseMesh *LPD3DXBASEMESH;
  82. typedef struct ID3DXMesh *LPD3DXMESH;
  83. typedef struct ID3DXPMesh *LPD3DXPMESH;
  84. typedef struct ID3DXSPMesh *LPD3DXSPMESH;
  85. typedef struct ID3DXSkinMesh *LPD3DXSKINMESH;
  86.  
  87. typedef struct _D3DXATTRIBUTERANGE
  88. {
  89.     DWORD AttribId;
  90.     DWORD FaceStart;
  91.     DWORD FaceCount;
  92.     DWORD VertexStart;
  93.     DWORD VertexCount;
  94. } D3DXATTRIBUTERANGE;
  95.  
  96. typedef D3DXATTRIBUTERANGE* LPD3DXATTRIBUTERANGE;
  97.  
  98. #ifdef __cplusplus
  99. extern "C" {
  100. #endif //__cplusplus
  101. struct D3DXMATERIAL
  102. {
  103.     D3DMATERIAL8  MatD3D;
  104.     LPSTR         pTextureFilename;
  105. };
  106. typedef struct D3DXMATERIAL *LPD3DXMATERIAL;
  107. #ifdef __cplusplus
  108. }
  109. #endif //__cplusplus
  110.  
  111. typedef struct _D3DXATTRIBUTEWEIGHTS
  112. {
  113.     FLOAT Position;
  114.     FLOAT Boundary;
  115.     FLOAT Normal;
  116.     FLOAT Diffuse;
  117.     FLOAT Specular;
  118.     FLOAT Tex[8];
  119. } D3DXATTRIBUTEWEIGHTS;
  120.  
  121. typedef D3DXATTRIBUTEWEIGHTS* LPD3DXATTRIBUTEWEIGHTS;
  122.  
  123. enum _D3DXWELDEPSILONSFLAGS
  124. {
  125.     D3DXWELDEPSILONS_WELDALL = 0x1,              // weld all vertices marked by adjacency as being overlapping
  126.  
  127.     D3DXWELDEPSILONS_WELDPARTIALMATCHES = 0x2,   // if a given vertex component is within epsilon, modify partial matched 
  128.                                                     // vertices so that both components identical AND if all components "equal"
  129.                                                     // remove one of the vertices
  130.     D3DXWELDEPSILONS_DONOTREMOVEVERTICES = 0x4,  // instructs weld to only allow modifications to vertices and not removal
  131.                                                     // ONLY valid if D3DXWELDEPSILONS_WELDPARTIALMATCHES is set
  132.                                                     // useful to modify vertices to be equal, but not allow vertices to be removed
  133. };
  134.  
  135. typedef struct _D3DXWELDEPSILONS
  136. {
  137.     FLOAT SkinWeights;
  138.     FLOAT Normal;
  139.     FLOAT Tex[8];
  140.     DWORD Flags;
  141. } D3DXWELDEPSILONS;
  142.  
  143. typedef D3DXWELDEPSILONS* LPD3DXWELDEPSILONS;
  144.  
  145.  
  146. #undef INTERFACE
  147. #define INTERFACE ID3DXBaseMesh
  148.  
  149. DECLARE_INTERFACE_(ID3DXBaseMesh, IUnknown)
  150. {
  151.     // IUnknown
  152.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  153.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  154.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  155.  
  156.     // ID3DXBaseMesh
  157.     STDMETHOD(DrawSubset)(THIS_ DWORD AttribId) PURE;
  158.     STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE;
  159.     STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE;
  160.     STDMETHOD_(DWORD, GetFVF)(THIS) PURE;
  161.     STDMETHOD(GetDeclaration)(THIS_ DWORD Declaration[MAX_FVF_DECL_SIZE]) PURE;
  162.     STDMETHOD_(DWORD, GetOptions)(THIS) PURE;
  163.     STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE8* ppDevice) PURE;
  164.     STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options, 
  165.                 DWORD FVF, LPDIRECT3DDEVICE8 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE;
  166.     STDMETHOD(CloneMesh)(THIS_ DWORD Options, 
  167.                 CONST DWORD *pDeclaration, LPDIRECT3DDEVICE8 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE;
  168.     STDMETHOD(GetVertexBuffer)(THIS_ LPDIRECT3DVERTEXBUFFER8* ppVB) PURE;
  169.     STDMETHOD(GetIndexBuffer)(THIS_ LPDIRECT3DINDEXBUFFER8* ppIB) PURE;
  170.     STDMETHOD(LockVertexBuffer)(THIS_ DWORD Flags, BYTE** ppData) PURE;
  171.     STDMETHOD(UnlockVertexBuffer)(THIS) PURE;
  172.     STDMETHOD(LockIndexBuffer)(THIS_ DWORD Flags, BYTE** ppData) PURE;
  173.     STDMETHOD(UnlockIndexBuffer)(THIS) PURE;
  174.     STDMETHOD(GetAttributeTable)(
  175.                 THIS_ D3DXATTRIBUTERANGE *pAttribTable, DWORD* pAttribTableSize) PURE;
  176.  
  177.     STDMETHOD(ConvertPointRepsToAdjacency)(THIS_ CONST DWORD* pPRep, DWORD* pAdjacency) PURE;
  178.     STDMETHOD(ConvertAdjacencyToPointReps)(THIS_ CONST DWORD* pAdjacency, DWORD* pPRep) PURE;
  179.     STDMETHOD(GenerateAdjacency)(THIS_ FLOAT Epsilon, DWORD* pAdjacency) PURE;
  180. };
  181.  
  182.  
  183. #undef INTERFACE
  184. #define INTERFACE ID3DXMesh
  185.  
  186. DECLARE_INTERFACE_(ID3DXMesh, ID3DXBaseMesh)
  187. {
  188.     // IUnknown
  189.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  190.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  191.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  192.  
  193.     // ID3DXBaseMesh
  194.     STDMETHOD(DrawSubset)(THIS_ DWORD AttribId) PURE;
  195.     STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE;
  196.     STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE;
  197.     STDMETHOD_(DWORD, GetFVF)(THIS) PURE;
  198.     STDMETHOD(GetDeclaration)(THIS_ DWORD Declaration[MAX_FVF_DECL_SIZE]) PURE;
  199.     STDMETHOD_(DWORD, GetOptions)(THIS) PURE;
  200.     STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE8* ppDevice) PURE;
  201.     STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options, 
  202.                 DWORD FVF, LPDIRECT3DDEVICE8 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE;
  203.     STDMETHOD(CloneMesh)(THIS_ DWORD Options, 
  204.                 CONST DWORD *pDeclaration, LPDIRECT3DDEVICE8 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE;
  205.     STDMETHOD(GetVertexBuffer)(THIS_ LPDIRECT3DVERTEXBUFFER8* ppVB) PURE;
  206.     STDMETHOD(GetIndexBuffer)(THIS_ LPDIRECT3DINDEXBUFFER8* ppIB) PURE;
  207.     STDMETHOD(LockVertexBuffer)(THIS_ DWORD Flags, BYTE** ppData) PURE;
  208.     STDMETHOD(UnlockVertexBuffer)(THIS) PURE;
  209.     STDMETHOD(LockIndexBuffer)(THIS_ DWORD Flags, BYTE** ppData) PURE;
  210.     STDMETHOD(UnlockIndexBuffer)(THIS) PURE;
  211.     STDMETHOD(GetAttributeTable)(
  212.                 THIS_ D3DXATTRIBUTERANGE *pAttribTable, DWORD* pAttribTableSize) PURE;
  213.  
  214.     STDMETHOD(ConvertPointRepsToAdjacency)(THIS_ CONST DWORD* pPRep, DWORD* pAdjacency) PURE;
  215.     STDMETHOD(ConvertAdjacencyToPointReps)(THIS_ CONST DWORD* pAdjacency, DWORD* pPRep) PURE;
  216.     STDMETHOD(GenerateAdjacency)(THIS_ FLOAT Epsilon, DWORD* pAdjacency) PURE;
  217.  
  218.     // ID3DXMesh
  219.     STDMETHOD(LockAttributeBuffer)(THIS_ DWORD Flags, DWORD** ppData) PURE;
  220.     STDMETHOD(UnlockAttributeBuffer)(THIS) PURE;
  221.     STDMETHOD(Optimize)(THIS_ DWORD Flags, CONST DWORD* pAdjacencyIn, DWORD* pAdjacencyOut, 
  222.                      DWORD* pFaceRemap, LPD3DXBUFFER *ppVertexRemap,  
  223.                      LPD3DXMESH* ppOptMesh) PURE;
  224.     STDMETHOD(OptimizeInplace)(THIS_ DWORD Flags, CONST DWORD* pAdjacencyIn, DWORD* pAdjacencyOut, 
  225.                      DWORD* pFaceRemap, LPD3DXBUFFER *ppVertexRemap) PURE;
  226.  
  227. };
  228.  
  229.  
  230. #undef INTERFACE
  231. #define INTERFACE ID3DXPMesh
  232.  
  233. DECLARE_INTERFACE_(ID3DXPMesh, ID3DXBaseMesh)
  234. {
  235.     // IUnknown
  236.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  237.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  238.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  239.  
  240.     // ID3DXBaseMesh
  241.     STDMETHOD(DrawSubset)(THIS_ DWORD AttribId) PURE;
  242.     STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE;
  243.     STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE;
  244.     STDMETHOD_(DWORD, GetFVF)(THIS) PURE;
  245.     STDMETHOD(GetDeclaration)(THIS_ DWORD Declaration[MAX_FVF_DECL_SIZE]) PURE;
  246.     STDMETHOD_(DWORD, GetOptions)(THIS) PURE;
  247.     STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE8* ppDevice) PURE;
  248.     STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options, 
  249.                 DWORD FVF, LPDIRECT3DDEVICE8 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE;
  250.     STDMETHOD(CloneMesh)(THIS_ DWORD Options, 
  251.                 CONST DWORD *pDeclaration, LPDIRECT3DDEVICE8 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE;
  252.     STDMETHOD(GetVertexBuffer)(THIS_ LPDIRECT3DVERTEXBUFFER8* ppVB) PURE;
  253.     STDMETHOD(GetIndexBuffer)(THIS_ LPDIRECT3DINDEXBUFFER8* ppIB) PURE;
  254.     STDMETHOD(LockVertexBuffer)(THIS_ DWORD Flags, BYTE** ppData) PURE;
  255.     STDMETHOD(UnlockVertexBuffer)(THIS) PURE;
  256.     STDMETHOD(LockIndexBuffer)(THIS_ DWORD Flags, BYTE** ppData) PURE;
  257.     STDMETHOD(UnlockIndexBuffer)(THIS) PURE;
  258.     STDMETHOD(GetAttributeTable)(
  259.                 THIS_ D3DXATTRIBUTERANGE *pAttribTable, DWORD* pAttribTableSize) PURE;
  260.  
  261.     STDMETHOD(ConvertPointRepsToAdjacency)(THIS_ CONST DWORD* pPRep, DWORD* pAdjacency) PURE;
  262.     STDMETHOD(ConvertAdjacencyToPointReps)(THIS_ CONST DWORD* pAdjacency, DWORD* pPRep) PURE;
  263.     STDMETHOD(GenerateAdjacency)(THIS_ FLOAT Epsilon, DWORD* pAdjacency) PURE;
  264.  
  265.     // ID3DXPMesh
  266.     STDMETHOD(ClonePMeshFVF)(THIS_ DWORD Options, 
  267.                 DWORD FVF, LPDIRECT3DDEVICE8 pD3D, LPD3DXPMESH* ppCloneMesh) PURE;
  268.     STDMETHOD(ClonePMesh)(THIS_ DWORD Options, 
  269.                 CONST DWORD *pDeclaration, LPDIRECT3DDEVICE8 pD3D, LPD3DXPMESH* ppCloneMesh) PURE;
  270.     STDMETHOD(SetNumFaces)(THIS_ DWORD Faces) PURE;
  271.     STDMETHOD(SetNumVertices)(THIS_ DWORD Vertices) PURE;
  272.     STDMETHOD_(DWORD, GetMaxFaces)(THIS) PURE;
  273.     STDMETHOD_(DWORD, GetMinFaces)(THIS) PURE;
  274.     STDMETHOD_(DWORD, GetMaxVertices)(THIS) PURE;
  275.     STDMETHOD_(DWORD, GetMinVertices)(THIS) PURE;
  276.     STDMETHOD(Save)(THIS_ IStream *pStream, LPD3DXMATERIAL pMaterials, DWORD NumMaterials) PURE;
  277.  
  278.     STDMETHOD(Optimize)(THIS_ DWORD Flags, DWORD* pAdjacencyOut, 
  279.                      DWORD* pFaceRemap, LPD3DXBUFFER *ppVertexRemap,  
  280.                      LPD3DXMESH* ppOptMesh) PURE;
  281.  
  282.     STDMETHOD(OptimizeBaseLOD)(THIS_ DWORD Flags, DWORD* pFaceRemap) PURE;
  283.     STDMETHOD(TrimByFaces)(THIS_ DWORD NewFacesMin, DWORD NewFacesMax, DWORD *rgiFaceRemap, DWORD *rgiVertRemap) PURE;
  284.     STDMETHOD(TrimByVertices)(THIS_ DWORD NewVerticesMin, DWORD NewVerticesMax, DWORD *rgiFaceRemap, DWORD *rgiVertRemap) PURE;
  285.  
  286.     STDMETHOD(GetAdjacency)(THIS_ DWORD* pAdjacency) PURE;
  287. };
  288.  
  289.  
  290. #undef INTERFACE
  291. #define INTERFACE ID3DXSPMesh
  292.  
  293. DECLARE_INTERFACE_(ID3DXSPMesh, IUnknown)
  294. {
  295.     // IUnknown
  296.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  297.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  298.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  299.  
  300.     // ID3DXSPMesh
  301.     STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE;
  302.     STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE;
  303.     STDMETHOD_(DWORD, GetFVF)(THIS) PURE;
  304.     STDMETHOD(GetDeclaration)(THIS_ DWORD Declaration[MAX_FVF_DECL_SIZE]) PURE;
  305.     STDMETHOD_(DWORD, GetOptions)(THIS) PURE;
  306.     STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE8* ppDevice) PURE;
  307.     STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options, 
  308.                 DWORD FVF, LPDIRECT3DDEVICE8 pD3D, DWORD *pAdjacencyOut, DWORD *pVertexRemapOut, LPD3DXMESH* ppCloneMesh) PURE;
  309.     STDMETHOD(CloneMesh)(THIS_ DWORD Options, 
  310.                 CONST DWORD *pDeclaration, LPDIRECT3DDEVICE8 pD3DDevice, DWORD *pAdjacencyOut, DWORD *pVertexRemapOut, LPD3DXMESH* ppCloneMesh) PURE;
  311.     STDMETHOD(ClonePMeshFVF)(THIS_ DWORD Options, 
  312.                 DWORD FVF, LPDIRECT3DDEVICE8 pD3D, DWORD *pVertexRemapOut, LPD3DXPMESH* ppCloneMesh) PURE;
  313.     STDMETHOD(ClonePMesh)(THIS_ DWORD Options, 
  314.                 CONST DWORD *pDeclaration, LPDIRECT3DDEVICE8 pD3D, DWORD *pVertexRemapOut, LPD3DXPMESH* ppCloneMesh) PURE;
  315.     STDMETHOD(ReduceFaces)(THIS_ DWORD Faces) PURE;
  316.     STDMETHOD(ReduceVertices)(THIS_ DWORD Vertices) PURE;
  317.     STDMETHOD_(DWORD, GetMaxFaces)(THIS) PURE;
  318.     STDMETHOD_(DWORD, GetMaxVertices)(THIS) PURE;
  319.     STDMETHOD(GetVertexAttributeWeights)(THIS_ LPD3DXATTRIBUTEWEIGHTS pVertexAttributeWeights) PURE;
  320.     STDMETHOD(GetVertexWeights)(THIS_ FLOAT *pVertexWeights) PURE;
  321. };
  322.  
  323. #define UNUSED16 (0xffff)
  324. #define UNUSED32 (0xffffffff)
  325.  
  326. // ID3DXMesh::Optimize options - upper byte only, lower 3 bytes used from _D3DXMESH option flags
  327. enum _D3DXMESHOPT {
  328.     D3DXMESHOPT_COMPACT       = 0x01000000,
  329.     D3DXMESHOPT_ATTRSORT      = 0x02000000,
  330.     D3DXMESHOPT_VERTEXCACHE   = 0x04000000,
  331.     D3DXMESHOPT_STRIPREORDER  = 0x08000000,
  332.     D3DXMESHOPT_IGNOREVERTS   = 0x10000000,  // optimize faces only, don't touch vertices
  333.     D3DXMESHOPT_SHAREVB       =     0x1000,         // same as D3DXMESH_VB_SHARE
  334. };
  335.  
  336. // Subset of the mesh that has the same attribute and bone combination.
  337. // This subset can be rendered in a single draw call
  338. typedef struct _D3DXBONECOMBINATION
  339. {
  340.     DWORD AttribId;
  341.     DWORD FaceStart;
  342.     DWORD FaceCount;
  343.     DWORD VertexStart;
  344.     DWORD VertexCount;
  345.     DWORD* BoneId;
  346. } D3DXBONECOMBINATION, *LPD3DXBONECOMBINATION;
  347.  
  348.  
  349. #undef INTERFACE
  350. #define INTERFACE ID3DXSkinMesh
  351.  
  352. DECLARE_INTERFACE_(ID3DXSkinMesh, IUnknown)
  353. {
  354.     // IUnknown
  355.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  356.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  357.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  358.  
  359.     // ID3DXMesh
  360.     STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE;
  361.     STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE;
  362.     STDMETHOD_(DWORD, GetFVF)(THIS) PURE;
  363.     STDMETHOD(GetDeclaration)(THIS_ DWORD Declaration[MAX_FVF_DECL_SIZE]) PURE;
  364.     STDMETHOD_(DWORD, GetOptions)(THIS) PURE;
  365.     STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE8* ppDevice) PURE;
  366.     STDMETHOD(GetVertexBuffer)(THIS_ LPDIRECT3DVERTEXBUFFER8* ppVB) PURE;
  367.     STDMETHOD(GetIndexBuffer)(THIS_ LPDIRECT3DINDEXBUFFER8* ppIB) PURE;
  368.     STDMETHOD(LockVertexBuffer)(THIS_ DWORD flags, BYTE** ppData) PURE;
  369.     STDMETHOD(UnlockVertexBuffer)(THIS) PURE;
  370.     STDMETHOD(LockIndexBuffer)(THIS_ DWORD flags, BYTE** ppData) PURE;
  371.     STDMETHOD(UnlockIndexBuffer)(THIS) PURE;
  372.     STDMETHOD(LockAttributeBuffer)(THIS_ DWORD flags, DWORD** ppData) PURE;
  373.     STDMETHOD(UnlockAttributeBuffer)(THIS) PURE;
  374.     // ID3DXSkinMesh
  375.     STDMETHOD_(DWORD, GetNumBones)(THIS) PURE;
  376.     STDMETHOD(GetOriginalMesh)(THIS_ LPD3DXMESH* ppMesh) PURE;
  377.     STDMETHOD(SetBoneInfluence)(THIS_ DWORD bone, DWORD numInfluences, CONST DWORD* vertices, CONST FLOAT* weights) PURE;
  378.     STDMETHOD_(DWORD, GetNumBoneInfluences)(THIS_ DWORD bone) PURE;
  379.     STDMETHOD(GetBoneInfluence)(THIS_ DWORD bone, DWORD* vertices, FLOAT* weights) PURE;
  380.     STDMETHOD(GetMaxVertexInfluences)(THIS_ DWORD* maxVertexInfluences) PURE;
  381.     STDMETHOD(GetMaxFaceInfluences)(THIS_ DWORD* maxFaceInfluences) PURE;
  382.  
  383.     STDMETHOD(ConvertToBlendedMesh)(THIS_ DWORD Options, 
  384.                                     CONST LPDWORD pAdjacencyIn, 
  385.                                     LPDWORD pAdjacencyOut,
  386.                                     DWORD* pNumBoneCombinations, 
  387.                                     LPD3DXBUFFER* ppBoneCombinationTable, 
  388.                                     DWORD* pFaceRemap, 
  389.                                     LPD3DXBUFFER *ppVertexRemap, 
  390.                                     LPD3DXMESH* ppMesh) PURE;
  391.  
  392.     STDMETHOD(ConvertToIndexedBlendedMesh)(THIS_ DWORD Options, 
  393.                                            CONST LPDWORD pAdjacencyIn, 
  394.                                            DWORD paletteSize, 
  395.                                            LPDWORD pAdjacencyOut, 
  396.                                            DWORD* pNumBoneCombinations, 
  397.                                            LPD3DXBUFFER* ppBoneCombinationTable, 
  398.                                            DWORD* pFaceRemap, 
  399.                                            LPD3DXBUFFER *ppVertexRemap, 
  400.                                            LPD3DXMESH* ppMesh) PURE;
  401.  
  402.     STDMETHOD(GenerateSkinnedMesh)(THIS_ DWORD Options, 
  403.                                    FLOAT minWeight, 
  404.                                    CONST LPDWORD pAdjacencyIn, 
  405.                                    LPDWORD pAdjacencyOut, 
  406.                                    DWORD* pFaceRemap, 
  407.                                    LPD3DXBUFFER *ppVertexRemap, 
  408.                                    LPD3DXMESH* ppMesh) PURE;
  409.     STDMETHOD(UpdateSkinnedMesh)(THIS_ CONST D3DXMATRIX* pBoneTransforms, CONST D3DXMATRIX* pBoneInvTransforms, LPD3DXMESH pMesh) PURE;
  410. };
  411.  
  412. #ifdef __cplusplus
  413. extern "C" {
  414. #endif //__cplusplus
  415.  
  416. HRESULT WINAPI 
  417.     D3DXCreateMesh(
  418.         DWORD NumFaces, 
  419.         DWORD NumVertices, 
  420.         DWORD Options, 
  421.         CONST DWORD *pDeclaration, 
  422.         LPDIRECT3DDEVICE8 pD3D, 
  423.         LPD3DXMESH* ppMesh);
  424.  
  425. HRESULT WINAPI 
  426.     D3DXCreateMeshFVF(
  427.         DWORD NumFaces, 
  428.         DWORD NumVertices, 
  429.         DWORD Options, 
  430.         DWORD FVF, 
  431.         LPDIRECT3DDEVICE8 pD3D, 
  432.         LPD3DXMESH* ppMesh);
  433.  
  434. HRESULT WINAPI 
  435.     D3DXCreateSPMesh(
  436.         LPD3DXMESH pMesh, 
  437.         CONST DWORD* pAdjacency, 
  438.         CONST LPD3DXATTRIBUTEWEIGHTS pVertexAttributeWeights,
  439.         CONST FLOAT *pVertexWeights,
  440.         LPD3DXSPMESH* ppSMesh);
  441.  
  442. // clean a mesh up for simplification, try to make manifold
  443. HRESULT WINAPI
  444.     D3DXCleanMesh(
  445.     LPD3DXMESH pMeshIn,
  446.     CONST DWORD* pAdjacencyIn,
  447.     LPD3DXMESH* ppMeshOut,
  448.     DWORD* pAdjacencyOut,
  449.     LPD3DXBUFFER* ppErrorsAndWarnings);
  450.  
  451. HRESULT WINAPI
  452.     D3DXValidMesh(
  453.     LPD3DXMESH pMeshIn,
  454.     CONST DWORD* pAdjacency,
  455.     LPD3DXBUFFER* ppErrorsAndWarnings);
  456.  
  457. HRESULT WINAPI 
  458.     D3DXGeneratePMesh(
  459.         LPD3DXMESH pMesh, 
  460.         CONST DWORD* pAdjacency, 
  461.         CONST LPD3DXATTRIBUTEWEIGHTS pVertexAttributeWeights,
  462.         CONST FLOAT *pVertexWeights,
  463.         DWORD MinValue, 
  464.         DWORD Options, 
  465.         LPD3DXPMESH* ppPMesh);
  466.  
  467. HRESULT WINAPI 
  468.     D3DXSimplifyMesh(
  469.         LPD3DXMESH pMesh, 
  470.         CONST DWORD* pAdjacency, 
  471.         CONST LPD3DXATTRIBUTEWEIGHTS pVertexAttributeWeights,
  472.         CONST FLOAT *pVertexWeights,
  473.         DWORD MinValue, 
  474.         DWORD Options, 
  475.         LPD3DXMESH* ppMesh);
  476.  
  477. HRESULT WINAPI 
  478.     D3DXComputeBoundingSphere(
  479.         PVOID pPointsFVF, 
  480.         DWORD NumVertices, 
  481.         DWORD FVF,
  482.         D3DXVECTOR3 *pCenter, 
  483.         FLOAT *pRadius);
  484.  
  485. HRESULT WINAPI 
  486.     D3DXComputeBoundingBox(
  487.         PVOID pPointsFVF, 
  488.         DWORD NumVertices, 
  489.         DWORD FVF,
  490.         D3DXVECTOR3 *pMin, 
  491.         D3DXVECTOR3 *pMax);
  492.  
  493. HRESULT WINAPI 
  494.     D3DXComputeNormals(
  495.         LPD3DXBASEMESH pMesh,
  496.         CONST DWORD *pAdjacency);
  497.  
  498. HRESULT WINAPI 
  499.     D3DXCreateBuffer(
  500.         DWORD NumBytes, 
  501.         LPD3DXBUFFER *ppBuffer);
  502.  
  503.  
  504. HRESULT WINAPI
  505.     D3DXLoadMeshFromX(
  506.         LPSTR pFilename, 
  507.         DWORD Options, 
  508.         LPDIRECT3DDEVICE8 pD3D, 
  509.         LPD3DXBUFFER *ppAdjacency,
  510.         LPD3DXBUFFER *ppMaterials, 
  511.         DWORD *pNumMaterials,
  512.         LPD3DXMESH *ppMesh);
  513.  
  514. HRESULT WINAPI 
  515.     D3DXLoadMeshFromXInMemory(
  516.         PBYTE Memory,
  517.         DWORD SizeOfMemory,
  518.         DWORD Options, 
  519.         LPDIRECT3DDEVICE8 pD3D, 
  520.         LPD3DXBUFFER *ppAdjacency,
  521.         LPD3DXBUFFER *ppMaterials, 
  522.         DWORD *pNumMaterials,
  523.         LPD3DXMESH *ppMesh);
  524.  
  525. HRESULT WINAPI 
  526.     D3DXLoadMeshFromXResource(
  527.         HMODULE Module,
  528.         LPCTSTR Name,
  529.         LPCTSTR Type,
  530.         DWORD Options, 
  531.         LPDIRECT3DDEVICE8 pD3D, 
  532.         LPD3DXBUFFER *ppAdjacency,
  533.         LPD3DXBUFFER *ppMaterials, 
  534.         DWORD *pNumMaterials,
  535.         LPD3DXMESH *ppMesh);
  536.  
  537. HRESULT WINAPI 
  538.     D3DXSaveMeshToX(
  539.         LPSTR pFilename,
  540.         LPD3DXMESH pMesh,
  541.         CONST DWORD* pAdjacency,
  542.         CONST LPD3DXMATERIAL pMaterials,
  543.         DWORD NumMaterials,
  544.         DWORD Format
  545.         );
  546.  
  547. HRESULT WINAPI 
  548.     D3DXCreatePMeshFromStream(
  549.         IStream *pStream, 
  550.         DWORD Options,
  551.         LPDIRECT3DDEVICE8 pD3DDevice, 
  552.         LPD3DXBUFFER *ppMaterials,
  553.         DWORD* pNumMaterials,
  554.         LPD3DXPMESH *ppPMesh);
  555.  
  556. HRESULT WINAPI
  557.     D3DXCreateSkinMesh(
  558.         DWORD NumFaces, 
  559.         DWORD NumVertices, 
  560.         DWORD NumBones,
  561.         DWORD Options, 
  562.         CONST DWORD *pDeclaration, 
  563.         LPDIRECT3DDEVICE8 pD3D, 
  564.         LPD3DXSKINMESH* ppSkinMesh);
  565.  
  566. HRESULT WINAPI
  567.     D3DXCreateSkinMeshFVF(
  568.         DWORD NumFaces, 
  569.         DWORD NumVertices, 
  570.         DWORD NumBones,
  571.         DWORD Options, 
  572.         DWORD FVF, 
  573.         LPDIRECT3DDEVICE8 pD3D, 
  574.         LPD3DXSKINMESH* ppSkinMesh);
  575.  
  576. HRESULT WINAPI
  577.     D3DXCreateSkinMeshFromMesh(
  578.         LPD3DXMESH pMesh,
  579.         DWORD numBones,
  580.         LPD3DXSKINMESH* ppSkinMesh);
  581.  
  582. HRESULT WINAPI 
  583.     D3DXLoadMeshFromXof(
  584.         LPDIRECTXFILEDATA pXofObjMesh, 
  585.         DWORD Options, 
  586.         LPDIRECT3DDEVICE8 pD3DDevice, 
  587.         LPD3DXBUFFER *ppAdjacency,
  588.         LPD3DXBUFFER *ppMaterials, 
  589.         DWORD *pNumMaterials,
  590.         LPD3DXMESH *ppMesh);
  591.  
  592. HRESULT WINAPI
  593.     D3DXLoadSkinMeshFromXof(
  594.         LPDIRECTXFILEDATA pxofobjMesh, 
  595.         DWORD Options,
  596.         LPDIRECT3DDEVICE8 pD3D,
  597.         LPD3DXBUFFER* ppAdjacency,
  598.         LPD3DXBUFFER* ppMaterials,
  599.         DWORD *pMatOut,
  600.         LPD3DXBUFFER* ppBoneNames,
  601.         LPD3DXBUFFER* ppBoneTransforms,
  602.         LPD3DXSKINMESH* ppMesh);
  603.  
  604. HRESULT WINAPI
  605.     D3DXTessellateNPatches(
  606.         LPD3DXMESH pMeshIn,             
  607.         CONST DWORD* pAdjacencyIn,             
  608.         FLOAT NumSegs,                    
  609.         BOOL  QuadraticInterpNormals,     // if false use linear intrep for normals, if true use quadratic
  610.         LPD3DXMESH *ppMeshOut,
  611.         LPD3DXBUFFER *ppAdjacencyOut);
  612.  
  613. UINT WINAPI
  614.     D3DXGetFVFVertexSize(DWORD FVF);
  615.  
  616. HRESULT WINAPI
  617.     D3DXDeclaratorFromFVF(
  618.         DWORD FVF,
  619.         DWORD Declaration[MAX_FVF_DECL_SIZE]);
  620.  
  621. HRESULT WINAPI
  622.     D3DXFVFFromDeclarator(
  623.         CONST DWORD *pDeclarator,
  624.         DWORD *pFVF);
  625.  
  626. HRESULT WINAPI 
  627.     D3DXWeldVertices(
  628.         CONST LPD3DXMESH pMesh,         
  629.         LPD3DXWELDEPSILONS pEpsilons,                 
  630.         CONST DWORD *pAdjacencyIn, 
  631.         DWORD *pAdjacencyOut,
  632.         DWORD* pFaceRemap, 
  633.         LPD3DXBUFFER *ppVertexRemap);
  634.  
  635. typedef struct _D3DXINTERSECTINFO
  636. {
  637.     DWORD FaceIndex;                // index of face intersected
  638.     FLOAT U;                        // Barycentric Hit Coordinates    
  639.     FLOAT V;                        // Barycentric Hit Coordinates
  640.     FLOAT Dist;                     // Ray-Intersection Parameter Distance
  641. } D3DXINTERSECTINFO, *LPD3DXINTERSECTINFO;
  642.  
  643.  
  644. HRESULT WINAPI
  645.     D3DXIntersect(
  646.         LPD3DXBASEMESH pMesh,
  647.         CONST D3DXVECTOR3 *pRayPos,
  648.         CONST D3DXVECTOR3 *pRayDir, 
  649.         BOOL    *pHit,              // True if any faces were intersected
  650.         DWORD   *pFaceIndex,        // index of closest face intersected
  651.         FLOAT   *pU,                // Barycentric Hit Coordinates    
  652.         FLOAT   *pV,                // Barycentric Hit Coordinates
  653.         FLOAT   *pDist,             // Ray-Intersection Parameter Distance
  654.         LPD3DXBUFFER *ppAllHits,    // Array of D3DXINTERSECTINFOs for all hits (not just closest) 
  655.         DWORD   *pCountOfHits);     // Number of entries in AllHits array
  656.  
  657. HRESULT WINAPI
  658.     D3DXIntersectSubset(
  659.         LPD3DXBASEMESH pMesh,
  660.         DWORD AttribId,
  661.         CONST D3DXVECTOR3 *pRayPos,
  662.         CONST D3DXVECTOR3 *pRayDir, 
  663.         BOOL    *pHit,              // True if any faces were intersected
  664.         DWORD   *pFaceIndex,        // index of closest face intersected
  665.         FLOAT   *pU,                // Barycentric Hit Coordinates    
  666.         FLOAT   *pV,                // Barycentric Hit Coordinates
  667.         FLOAT   *pDist,             // Ray-Intersection Parameter Distance
  668.         LPD3DXBUFFER *ppAllHits,    // Array of D3DXINTERSECTINFOs for all hits (not just closest) 
  669.         DWORD   *pCountOfHits);     // Number of entries in AllHits array
  670.  
  671.  
  672. HRESULT WINAPI D3DXSplitMesh
  673.     (
  674.     CONST LPD3DXMESH pMeshIn,         
  675.     CONST DWORD *pAdjacencyIn, 
  676.     CONST DWORD MaxSize,
  677.     CONST DWORD Options,
  678.     DWORD *pMeshesOut,
  679.     LPD3DXBUFFER *ppMeshArrayOut,
  680.     LPD3DXBUFFER *ppAdjacencyArrayOut,
  681.     LPD3DXBUFFER *ppFaceRemapArrayOut,
  682.     LPD3DXBUFFER *ppVertRemapArrayOut
  683.     );
  684.  
  685. BOOL D3DXIntersectTri 
  686. (
  687.     CONST D3DXVECTOR3 *p0,           // Triangle vertex 0 position
  688.     CONST D3DXVECTOR3 *p1,           // Triangle vertex 1 position
  689.     CONST D3DXVECTOR3 *p2,           // Triangle vertex 2 position
  690.     CONST D3DXVECTOR3 *pRayPos,      // Ray origin
  691.     CONST D3DXVECTOR3 *pRayDir,      // Ray direction
  692.     FLOAT *pU,                       // Barycentric Hit Coordinates
  693.     FLOAT *pV,                       // Barycentric Hit Coordinates
  694.     FLOAT *pDist);                   // Ray-Intersection Parameter Distance
  695.  
  696. BOOL WINAPI
  697.     D3DXSphereBoundProbe(
  698.         CONST D3DXVECTOR3 *pCenter,
  699.         FLOAT Radius,
  700.         CONST D3DXVECTOR3 *pRayPosition,
  701.         CONST D3DXVECTOR3 *pRayDirection);
  702.  
  703. BOOL WINAPI 
  704.     D3DXBoxBoundProbe(
  705.         CONST D3DXVECTOR3 *pMin, 
  706.         CONST D3DXVECTOR3 *pMax,
  707.         CONST D3DXVECTOR3 *pRayPosition,
  708.         CONST D3DXVECTOR3 *pRayDirection);
  709.  
  710. enum _D3DXERR {
  711.     D3DXERR_CANNOTMODIFYINDEXBUFFER     = MAKE_DDHRESULT(2900),
  712.     D3DXERR_INVALIDMESH                 = MAKE_DDHRESULT(2901),
  713.     D3DXERR_CANNOTATTRSORT              = MAKE_DDHRESULT(2902),
  714.     D3DXERR_SKINNINGNOTSUPPORTED        = MAKE_DDHRESULT(2903),
  715.     D3DXERR_TOOMANYINFLUENCES           = MAKE_DDHRESULT(2904),
  716.     D3DXERR_INVALIDDATA                 = MAKE_DDHRESULT(2905),
  717.     D3DXERR_LOADEDMESHASNODATA          = MAKE_DDHRESULT(2906),
  718. };
  719.  
  720.  
  721. #define D3DX_COMP_TANGENT_NONE 0xFFFFFFFF
  722.  
  723. HRESULT WINAPI D3DXComputeTangent(LPD3DXMESH InMesh,
  724.                                  DWORD TexStage,
  725.                                  LPD3DXMESH OutMesh,
  726.                                  DWORD TexStageUVec,
  727.                                  DWORD TexStageVVec,
  728.                                  DWORD Wrap,
  729.                                  DWORD *Adjacency);
  730.  
  731. HRESULT WINAPI
  732. D3DXConvertMeshSubsetToSingleStrip
  733. (
  734.     LPD3DXBASEMESH MeshIn,
  735.     DWORD AttribId,
  736.     DWORD IBOptions,
  737.     LPDIRECT3DINDEXBUFFER8 *ppIndexBuffer,
  738.     DWORD *pNumIndices
  739. );
  740.  
  741. HRESULT WINAPI
  742. D3DXConvertMeshSubsetToStrips
  743. (
  744.     LPD3DXBASEMESH MeshIn,
  745.     DWORD AttribId,
  746.     DWORD IBOptions,
  747.     LPDIRECT3DINDEXBUFFER8 *ppIndexBuffer,
  748.     DWORD *pNumIndices,
  749.     LPD3DXBUFFER *ppStripLengths,
  750.     DWORD *pNumStrips
  751. );
  752.  
  753.  
  754. #ifdef __cplusplus
  755. }
  756. #endif //__cplusplus
  757.  
  758. #endif //__D3DX8MESH_H__
  759.  
  760.  
  761.